package com.bigshen.algorithm.gTree.solution06BalancedBinaryTree;

/**
 * 110. 平衡二叉树
 *
 * 给定一个二叉树，判断它是否是高度平衡的二叉树。
 *
 * 本题中，一棵高度平衡二叉树定义为：
 *
 * 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
 *
 * 输入：root = [3,9,20,null,null,15,7]
 * 输出：true
 *
 * 输入：root = [1,2,2,3,3,null,null,4,4]
 * 输出：false
 */
public class Solution {

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        public TreeNode(int val) {
            this.val = val;
        }
    }

    public boolean isBalanced(TreeNode root) {
        if (null == root) {
            return true;
        }
        return depth(root) > 0;
    }

    private int depth(TreeNode node) {
        if (null == node) {
            return 0;
        }
        int left = depth(node.left);
        int right = depth(node.right);

        // 两边高度相减大于1，表明不平衡
        if (Math.abs(left-right) > 1) {
            return -1;
        }

        if (left == -1 || right == -1) {
            return -1;
        }

        // 父节点高度为子节点最高的高度 + 1
        return Math.max(left, right) + 1;
    }

}
